import java.util.*;

/**
 * @author LKQ
 * @date 2022/5/10 22:48
 * @description 模拟
 * 1. 存在 ’e' 或 'E',左边小数或整数，右边必须为整数
 * 2、不存在， 那么整段可以是整数或浮点数
 *
 * 关键在于判断整数或浮点数，需满足以下所有条件：
 * +/- 只能出现在头部
 * 。最多出现一次
 * 至少出现一个数字
 */
public class Solution {
    public static void main(String[] args) {

    }
    public boolean isNumber(String s) {
        int n = s.length();
        char[] cs = s.toCharArray();
        // 记录 e 或 E的位置
        int idx = -1;
        for (int i = 0; i < n; i++) {
            if (cs[i] == 'E' || cs[i] == 'e') {
                if (idx == -1) {
                    idx = i;
                }else {
                    // 不止一个e或 E
                    return false;
                }
            }
        }
        boolean ans = true;
        if (idx != -1) {
            // 左边不必为整数，也可以是小数
            ans &= check(cs, 0, idx - 1, false);
            // 右边必须为整数
            ans &= check(cs, idx + 1, n - 1, true);
        }else {
            // 不存在 e 或 E, 那么可以为整数， 也可以是小数
            ans &= check(cs, 0, n - 1, false);
        }
        return ans;
    }
    public boolean check(char[] cs, int start, int end, boolean mustInteger) {
        if (start > end) return false;
        if (cs[start] == '+' || cs[start] == '-') start++;
        boolean hasDot = false, hasNum = false;
        for (int i = start; i <= end; i++) {
            if (cs[i] == '.') {
                if (mustInteger || hasDot) {
                    return false;
                }
                hasDot = true;
            } else if (cs[i] >= '0' && cs[i] <= '9') {
                hasNum = true;
            } else {
                return false;
            }
        }
        return hasNum;

    }
}
